package com.it.jzs.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.it.jzs.dao.CommentMapper;
import com.it.jzs.dao.admin.AdminUserMapper;
import com.it.jzs.pojo.Comment;
import com.it.jzs.pojo.User;
import com.it.jzs.service.CommentService;
import com.it.jzs.util.CommentThreadLocal;
import com.it.jzs.vo.BlogCommentVo;
import com.it.jzs.vo.Result;
import com.it.jzs.vo.params.CommentParams;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class CommentServiceImpl implements CommentService {
//test
    @Resource
    private CommentMapper commentMapper;

    @Resource
    private AdminUserMapper userMapper;

    // 定义 ThreadLocal 对象i ，区别于上面的int i
    private static ThreadLocal<Integer> i = new ThreadLocal<Integer>() {
        @Override
        // 初始化 i
        protected Integer initialValue() {
            return 0;
        }
    };

//    private List<BlogCommentVo> bigList = new ArrayList<>();

    @Override
    public Result<Object> insert(CommentParams commentParams) { // 插入一条评论
//            要先判断插入的是一级评论还是2级评论，根据在有没有父id
        Integer parentCommentId = commentParams.getParentCommentId();
        Integer parentCommentUserId     = commentParams.getParentCommentUserId();
        if (parentCommentId == null || parentCommentUserId == null) {
            commentParams.setCommentLevel(1); // 一级评论
            commentParams.setCreateTime(System.currentTimeMillis());
            commentParams.setParentCommentId(0);  // 一级评论标配
            commentParams.setParentCommentUserId(0);// 一级评论标配
            Comment comment = new Comment();
            BeanUtils.copyProperties(commentParams, comment);
            int insert = commentMapper.insert(comment);
            if (insert > 0) {
                return Result.success(null, "评论新增成功");
            }
        }
//          到这里说明不是一级评论
        commentParams.setCommentLevel(2); // 2级评论
        commentParams.setCreateTime(System.currentTimeMillis());
        Comment comment = new Comment();
        BeanUtils.copyProperties(commentParams, comment);
        int insert = commentMapper.insert(comment);
        if (insert > 0) {
            return Result.success(null, "评论新增成功");
        }
        return Result.error(null, "评论新增失败");

    }

    @Override
    public Result<Object> selectUserIdByCommentId(Integer id) { // 通过 评论id获取用户的id，返回前端给二级评论id设置父级
        Comment comment = commentMapper.selectById(id);
        Integer userId = comment.getUserId();
        return Result.success(userId, "获取用户id成功");

    }

    @Override
    public Result<Object> selectAll(Integer id) {
        List<BlogCommentVo> bigList = new ArrayList<>();
        CommentThreadLocal.put(bigList);  // 解决 单例模式下的成员变量线程安全问题
        QueryWrapper<Comment> wrapper = new QueryWrapper<>();
        wrapper.eq("blog_id", id);
        wrapper.orderByDesc("create_time");
        List<Comment> comments = commentMapper.selectList(wrapper);// 查询出这条博客的所有评论
        List<BlogCommentVo> list = new ArrayList<>();
        for (Comment comment : comments) {   // 时间戳转换
            Long createTime = comment.getCreateTime();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date(createTime);
            String format = simpleDateFormat.format(date);
            BlogCommentVo blogCommentVo = new BlogCommentVo();
            BeanUtils.copyProperties(comment, blogCommentVo);
            blogCommentVo.setFormatTime(format);
            list.add(blogCommentVo);
        }
        sort(list, 0);  // 递归查询 list是所有数据，pid是一级评论的父级id
        return Result.success(bigList, "ces");
    }


    private void sort(List<BlogCommentVo> commentVos, Integer pid) {
        List<BlogCommentVo> bigList = CommentThreadLocal.get();
        // 这个bigList类似于一个成员变量，只不过是线程私有的
//        使用这种是为了方便处理数据，就是如果这一行记录的父级id等于上一级的id就放在后面
//        比如，一条一级评论的id是30，父id是0  第一次
        for (BlogCommentVo commentVo : commentVos) {
            if (commentVo.getParentCommentId().equals(pid)) {
                if (commentVo.getCommentLevel().equals(2)) {  // 说明是2级评论 进行内容填充 @ xx
                    QueryWrapper<User> wrapper1 = new QueryWrapper<>();
                    wrapper1.eq("id", commentVo.getParentCommentUserId());
                    User user = userMapper.selectOne(wrapper1);
                    if (user!=null){   // 有可能用户已经被删除了  防止空指针异常
                        String content = commentVo.getContent(); // 给子评论的内容前缀添加父评论的名字
                        String str = "<a href=\"#\" style=\"text-decoration: none; color: #409EFF;\" > " + "@" + user.getNickname() + "</a>      ";
                        content = str + content;
                        commentVo.setContent(content);
                    }

                }
//                第一次： 到这把id为30的一级评论添加在这
                bigList.add(commentVo);
//                  第一次：id为30传进去递归查询，向下遍历把当前的id传进去
                sort(commentVos, commentVo.getId());
            }
        }
    }

    @Override
    public Result<Object> selectUserAvatar(Integer id) {  // 获取用户的头像
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("id", id);
        User user = userMapper.selectOne(wrapper);
        if (user != null) {   // 这里要进行判断， 有删除了用户的可能
            String avatar = user.getAvatar();
            return Result.success(avatar, "获取用户头像成功");

        } else {
            return Result.error(null,"获取用户失败");  //  这里的obj其实应该返回个已注销
        }


    }

    @Override // 根据博客id查询评论总数
    public Result<Object> selectCount(Integer id) {
        QueryWrapper<Comment> wrapper = new QueryWrapper<>();
        wrapper.eq("blog_id", id);
        Integer count = commentMapper.selectCount(wrapper);
        return Result.success(count, "获取评论总数超过！");

    }

    @Override
    public Result<Object> delete(Integer id, Integer userId) {  // 前台的id删除，其实在这还要校验一下，是否这条评论是这个用户的，
        List<Comment> commentList = commentMapper.selectList(new QueryWrapper<Comment>().eq("user_id", userId));// 查出这个用户id所有对应的评论
        boolean flag = false;
        for (Comment comment : commentList) {
            Integer userId1 = comment.getUserId();
            if (userId1.equals(userId)) {
                flag = true;
            }
        }
        if (flag) {
            int i = commentMapper.deleteById(id);
            if (i > 0) {
                return Result.success(null, "删除成功");
            } else {
                return Result.success(null, "删除失败");

            }
        } else {
            return Result.error(null, "没有这个权限");
        }


    }
}
